﻿using System;
using System.Collections.Generic;
using System.Security.Cryptography;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using DAO;
using Negocio;
using Excepciones;

namespace LisBioGUIWPF.Controls
{
    /// <summary>
    /// Lógica de interacción para SesionControl.xaml
    /// </summary>
    public partial class SesionControl : UserControl
    {
        private LisBio lisBio;

        public SesionControl(LisBio lisBio)
        {
            InitializeComponent();
            this.lisBio = lisBio;

            this.Loaded += new RoutedEventHandler(SesionControl_Loaded);
        }

        void SesionControl_Loaded(object sender, RoutedEventArgs e)
        {
            this.txtUserName.Focus();
        }

        private void btnAceptar_Click(object sender, RoutedEventArgs e)
        {
            ImageControl image = new ImageControl(this.lisBio);
            image.setDefaultImage();
            this.lisBio.borderHuella.Child = image;

            Entidades.EntidadInvestigador encargado = new Entidades.EntidadInvestigador();
            encargado.UserName = txtUserName.Text;

            byte[] tmpPassword;
            byte[] tmpHash;
            //Crea una matriz de bytes de los datos de origen
            tmpPassword = ASCIIEncoding.ASCII.GetBytes(txtPassword.Password);

            //Calcula hash a partir de los datos de origen
            tmpHash = new MD5CryptoServiceProvider().ComputeHash(tmpPassword);

            string password = ASCIIEncoding.ASCII.GetString(tmpHash);

            encargado.Password = password;

            InvestigadorDAO encargadoDao = new InvestigadorDAO();
            encargado = (Entidades.EntidadInvestigador) encargadoDao.checkLogin(encargado);

            if (encargado != null)
            {
                this.lisBio.expander.IsEnabled = true;
                this.lisBio.menuAdministrar.IsEnabled = true;
                this.lisBio.borderControles.Child = null;
                this.lisBio.lblEncargado.Content = "Encargado: "+encargado.NombreYApellido;
                this.lisBio.EncargadoLis = encargado;
                this.lisBio.btnSalidas.IsEnabled = true;
                this.lisBio.menuAsistencia.IsEnabled = true;
                this.lisBio.btnSalidas.IsEnabled = true;
                this.lisBio.menuIniciar.IsEnabled = false;
                this.lisBio.menuCerrar.IsEnabled = true;
                this.lisBio.borderHuella.IsEnabled = true;

                //Registrar Asistencia
                this.loginEncargado(encargado);
            }
            else
            {
                MessageBox.Show("No se reconoce el Encargado especificado", "Encargado Incorrecto");
            }
            
        }

        private void loginEncargado(Entidades.EntidadInvestigador encargado)
        {
            AsistenciaDAO asistenciaDAO = new AsistenciaDAO();
            DateTime date = DateTime.Now;
            Entidades.EntidadAsistencia nuevoIngreso = new Entidades.EntidadAsistencia(date, null, 
                encargado, new Entidades.EntidadProyecto());
            ReglaBase regla = new ReglaBase(nuevoIngreso, asistenciaDAO, ReglaBase.Operacion.INSERT);

            try
            {
                regla.execute();
                this.lisBio.notification("Sesion Iniciada");
            }
            catch (InvalidEntityException exc)
            {
                MessageBox.Show("No se pudo registrar el ingreso del Encargado", "Asistencia Encargado");
            }
            catch (Exception exception)
            {
                MessageBox.Show("Se ha producido el siguiente error:\n" + exception.Message, "Error!");

                MessageBoxResult result = MessageBox.Show("Desea reportar el error?", "Error Desconocido", MessageBoxButton.YesNo);

                if (result == MessageBoxResult.Yes)
                {
                    ReportBugs reportar = new ReportBugs();
                    reportar.Show();
                }
            }
        }

        public static void logoutEncargado(Entidades.EntidadInvestigador encargado, LisBio lisBio)
        {
            AsistenciaDAO asistenciaDAO = new AsistenciaDAO();
            Entidades.EntidadAsistencia asistencia = asistenciaDAO.ultimoIngreso(encargado.Id);

            if (asistencia != null)
            {
                if (asistencia.FechaYHoraSalida == null)
                {
                    DateTime date = DateTime.Now;
                    asistencia.FechaYHoraSalida = date;
                    ReglaBase regla = new ReglaBase(asistencia, asistenciaDAO, ReglaBase.Operacion.UPDATE);

                    try
                    {
                        regla.execute();
                        lisBio.notification("Sesion Finalizada");
                    }
                    catch (InvalidEntityException exc)
                    {
                        MessageBox.Show("No se pudo registrar la salida del Encargado", "Asistencia Encargado");
                    }
                    catch (Exception exception)
                    {
                        MessageBox.Show("Se ha producido el siguiente error:\n" + exception.Message, "Error!");

                        MessageBoxResult result = MessageBox.Show("Desea reportar el error?", "Error Desconocido", MessageBoxButton.YesNo);

                        if (result == MessageBoxResult.Yes)
                        {
                            ReportBugs reportar = new ReportBugs();
                            reportar.Show();
                        }
                    }
                }
            }
        }

        private void password_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)
            {
                this.btnAceptar_Click(sender, null);
            }
        }

    }
}
